# load("/Volumes/Research Project/Self-Anchoring/Combined/Combined/reportingAnalysesEnv.RData")
library(pacman)
p_load(tidyverse, ggdist, wesanderson, patchwork, brms, igraph, GGally, ggrepel, network, sna, here, performance, ggpubr)
params.UCLA <- arrow::read_parquet(here::here("Study 2/Cleaning/output/S_Logistic_1m_Oppose_Biasparams.UCLA.parquet"))
params.CSULA <- arrow::read_parquet(here::here("Study 2/Cleaning/output/S_Logistic_1m_Oppose_Biasparams.CSULA.parquet"))
params.NotUCR <- arrow::read_parquet(here::here("Study 2/Cleaning/output/S_Logistic_1m_Oppose_Biasparams.NotUCR.parquet"))
params2 <- rbind(
  cbind(params.UCLA,condition="UCLA"),
  cbind(params.CSULA,condition="CSU LA"),
  cbind(params.NotUCR,condition="Not UCR")
  )

params.Majority <- arrow::read_parquet(here::here("Study 3/Cleaning/output/S_Logistic_1m_Oppose_Biasparams.Majority.parquet"))
params.Minority <- arrow::read_parquet(here::here("Study 3/Cleaning/output/S_Logistic_1m_Oppose_Biasparams.Minority.parquet"))
params3 <- rbind(
  cbind(params.Majority,condition="Majority"),
  cbind(params.Minority,condition="Minority")
  )

# params3 <- rbind(
#   cbind(params.Majority),#,condition="Majority"),
#   cbind(params.Minority)#,condition="Minority")
#   )

load adjencency matrix for positive

#pos_adj <- read.csv("input/pos_adj.csv")
pos_adj <- read.csv(here("Combined/input/adjacencyMatrix_p.csv"))
colnames(pos_adj) <- 1:148
pos_adj <- as.matrix(pos_adj)
#pos_att <- read.csv("input/traitLevelAttribute_p.csv")
pos_att <- read.csv(here("Combined/input/allPosCents.csv"))
# generate graph object from the matrix
graph_pos <- graph_from_adjacency_matrix(pos_adj, mode = "directed", weighted=NULL)
V(graph_pos)$tNames <- pos_att$trait
pos_att$traitFriendly <- pos_att$trait
pos_att$traitFriendly[pos_att$traitFriendly!="Friendly"] <- ""
V(graph_pos)$FriendlyName <- pos_att$traitFriendly

Focus on “Friendly” - High outdegree centrality trait

FriendlyNet <- ego(graph_pos, order = 1, nodes = 46, mode = "all",
  mindist = 0)
FriendlyNet <- induced.subgraph(graph_pos, vids = unlist(FriendlyNet) )

set.seed(2)

egoNet <- ggnet2(FriendlyNet, size = "outdegree",  color = "dodgerblue",  palette = "Set2", mode = "fruchtermanreingold", directed=TRUE, arrow.size = 3, arrow.gap = 0.025, layout.exp = .35, alpha = .7, edge.alpha = .45) + 
  guides(color = FALSE, size = FALSE) + geom_text_repel(aes(label = V(FriendlyNet)$tNames), size = 3.5, force = .025, fontface = "bold")
egoNet

ggsave(egoNet, file = "/Volumes/Research Project/Self-Anchoring/Plots/outdegreeNet.png", units = "in", dpi = 300, width= 6, height = 4)

ggsave(egoNet, file = "/Volumes/Research Project/Self-Anchoring/Plots/outdegreeNet.tiff", units = "in", dpi = 300, width= 6, height = 4)

Feedback Community Colored

library(wesanderson)

graph_pos2 <- intergraph::asNetwork(graph_pos)
#graph_pos2 %v% "cluster" = as.character(V(graph_pos)$cluster)

set.seed(5)

p1 <- ggnet2(graph_pos2, size = "outdegree",  color = "dodgerblue", palette = "Dark2", mode = "kamadakawai", directed=TRUE, layout.exp = .65, alpha = .7, edge.alpha = .25) +
  guides(color = FALSE, size = FALSE)
p1

ggsave(p1, file = "/Volumes/Research Project/Self-Anchoring/Plots/colorNet.png", units = "in", dpi = 300, width= 6, height = 4)

ggsave(p1, file = "/Volumes/Research Project/Self-Anchoring/Plots/colorNet.tiff", units = "in", dpi = 300, width= 6, height = 4)

stack <- ggpubr::ggarrange(p1, egoNet, ncol=1, nrow=2)

ggsave(stack, file = "/Volumes/Research Project/Self-Anchoring/Plots/stackNetwork.png", dpi = 300, units = "in", width= 8, height = 10)

ggsave(stack, file = "/Volumes/Research Project/Self-Anchoring/Plots/stackNetwork.tiff", dpi = 300, units = "in", width= 8, height = 10)

Probability of Significance

library(bayestestR)
ps1 <- bayestestR::p_significance(WSRNOV.ING)
PS1.WSRNOV.ING <- plot(ps1) + jtools::theme_apa() + scale_y_discrete(labels = c("Similarity-to-Self\nX Novel","Novel","Similarity-to-Self")) + xlab(expression(beta)) + ylab("Fixed Effects") + geom_vline(xintercept = .18) + geom_vline(xintercept = -.18) + jtools::theme_apa() + ggtitle(NULL)
Scale for y is already present.
Adding another scale for y, which will replace the existing scale.
ggsave(PS1.WSRNOV.ING, file = "/Volumes/Research Project/Self-Anchoring/Plots/PSplot.png", dpi = 300, units = "in", width= 7.5, height =4.5)

ggsave(PS1.WSRNOV.ING, file = "/Volumes/Research Project/Self-Anchoring/Plots/PSplot.tiff", dpi = 300, units = "in", width= 7.5, height =4.5)

ps1 <- bayestestR::p_significance(WSRNOV.ING)
PS1.WSRNOV.ING <- plot(ps1) + jtools::theme_apa() + scale_y_discrete(labels = c("Similarity-to-Self\nX Novel","Novel","Similarity-to-Self")) + xlab(expression(beta)) + ylab("Fixed Effects") + geom_vline(xintercept = .18) + geom_vline(xintercept = -.18) + jtools::theme_apa() + ggtitle(NULL) + scale_fill_manual(values = c("red","red","blue"))

ps2 <- bayestestR::p_significance(WSRNOV.ING.2)
PS2.WSRNOV.ING <- plot(ps2) + jtools::theme_apa() + scale_y_discrete(labels = c("Similarity-to-Self\nX Novel","Novel","Similarity-to-Self")) + xlab(expression(beta)) + ylab("Fixed Effects") + geom_vline(xintercept = .18) + geom_vline(xintercept = -.18) + jtools::theme_apa() + ggtitle(NULL) + scale_fill_manual(values = c("red","blue","blue"))

ps3 <- bayestestR::p_significance(WSRNOV.ING.3)
PS3.WSRNOV.ING <- plot(ps3) + jtools::theme_apa() + scale_y_discrete(labels = c("Similarity-to-Self\nX Novel","Novel","Similarity-to-Self")) + xlab(expression(beta)) + ylab("Fixed Effects") + geom_vline(xintercept = .18) + geom_vline(xintercept = -.18) + jtools::theme_apa() + ggtitle(NULL) + scale_fill_manual(values = c("red","blue","blue"))

ggpubr::ggarrange(PS1.WSRNOV.ING, PS2.WSRNOV.ING, PS3.WSRNOV.ING, nrow=3, ncol=1)

ggsave("/Volumes/Research Project/Self-Anchoring/Plots/PS_Stack.png", height = 8, width = 9, units = "in")
ggsave("/Volumes/Research Project/Self-Anchoring/Plots/PS_Stack.tiff", height = 8, width = 9, units = "in")

Posterior Predictive Check

ING1PPC <- posterior_predictive_check(WSR.ING) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
ING2PPC <- posterior_predictive_check(WSR.ING.COND.2) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
ING3PPC <- posterior_predictive_check(WSR.ING.COND.3) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
SR1PPC <- posterior_predictive_check(MCS.SR) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
SR2PPC <- posterior_predictive_check(MCS.SR.COND.2) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
SR3PPC <- posterior_predictive_check(MCS.SR.COND.3) + jtools::theme_apa()
Using 10 posterior draws for ppc type 'dens_overlay' by default.
COMBPPC <- ggpubr::ggarrange(ING1PPC, ING2PPC, ING3PPC, SR1PPC, SR2PPC, SR3PPC, labels = c("A", "B", "C", "D", "E", "F"), nrow = 2, ncol =3, common.legend = T)

ggsave(COMBPPC, file = "/Volumes/Research Project/Self-Anchoring/Plots/PPCplot.png", dpi = 300, units = "in", width= 10, height = 9)

ggsave(COMBPPC, file = "/Volumes/Research Project/Self-Anchoring/Plots/PPCplot.tiff", dpi = 300, units = "in", width= 10, height = 9)

Study 1

Self-Evaluation Ingroup Classification

DES.ING.1.p <- conditional_effects(DES.ING)#, method = "posterior_linpred")
DES.ING.1.p_ <- DES.ING.1.p$`desirability.Z`
DES.ING.1.plot <-ggplot(DES.ING.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) + 
  theme(
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Desirability") + ylab("Ingroup Classification")
DES.ING.1.plot

Self-Evaluation Ingroup Classification

SR.ING.1.p <- conditional_effects(SELF.ING)#, method = "posterior_linpred")
SR.ING.1.p_ <- SR.ING.1.p$`selfResp.Z`
SR.ING.1.plot <-ggplot(SR.ING.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) + 
  theme(
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Self-Evaluation") + ylab("Ingroup Classification")
SR.ING.1.plot

Similarity-to-Self Ingroup Classification

WSR.ING.1.p <- conditional_effects(WSR.ING)#, method = "posterior_linpred")
WSR.ING.1.p_ <- WSR.ING.1.p$`WSR.Z`
WSR.ING.1.plot <-ggplot(WSR.ING.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) + 
  theme(
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Self") + ylab("Ingroup Classification")
WSR.ING.1.plot

Combine Plots

COMB.ING.1.plot1 <- ggarrange(DES.ING.1.plot, SR.ING.1.plot, WSR.ING.1.plot, labels=c("A","B","C"), nrow=1)

Metacontrast Ratio

MCS.SR.1.p <- conditional_effects(MCS.SR)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
MCS.SR.1.p_ <- MCS.SR.1.p$`metaContrastS.Z`
MCS.SR.1.MCRplot <-ggplot(MCS.SR.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) +
  theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Metacontrast Ratio") + ylab("Self-Evaluation")
MCS.SR.1.MCRplot

Similarity-to-Ingroup

ISOS.SR.1.p <- conditional_effects(ISOS.SR)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.1.p_ <- ISOS.SR.1.p$`inGsimS.Z`
ISOS.SR.1.InGplot <-ggplot(ISOS.SR.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) +
  theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Ingroup") + ylab("Self-Evaluation")
ISOS.SR.1.InGplot

Similarity-to-Outgroup

ISOS.SR.1.p <- conditional_effects(ISOS.SR)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.1.p_ <- ISOS.SR.1.p$`outGsimS.Z`
ISOS.SR.1.OutGplot <-ggplot(ISOS.SR.1.p_, aes(effect1__, estimate__)) +  geom_line(aes()) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__), alpha=0.15) +
  theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Outgroup") + ylab("Self-Evaluation")
ISOS.SR.1.OutGplot

Study 2

Warmth

warmthDf <- pivot_longer(indDiffs2, cols=starts_with("Therm_"), names_to="University", values_to="Warmth") %>% select(subID, University, Warmth) %>% drop_na()
warmthDf$University <- gsub("Therm_1","UCR", warmthDf$University)
warmthDf$University <- gsub("Therm_2","UCLA", warmthDf$University)
warmthDf$University <- gsub("Therm_4","CSU LA", warmthDf$University)

warmPlot2 <- ggplot(warmthDf, aes(University, Warmth)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA)  + scale_x_discrete(labels=c("Lower Status\nOutgroup","Higher Status\nOutgroup", "Ingroup")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Perceived Warmth",x="University") + jtools::theme_apa()

Status

indDiffs2$Status <- NULL
statusDf <- pivot_longer(indDiffs2, cols=ends_with("_Status"), names_to="University", values_to="Status") %>% select(subID, University, Status) %>% drop_na()
statusDf$University <- gsub("_Status","", statusDf$University)

statusDf$University <- as.factor(statusDf$University)
statusDf$subID <- as.factor(statusDf$subID)

statusPlot2 <- ggplot(statusDf, aes(University, Status)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + scale_x_discrete(labels=c("Lower Status\nOutgroup","Higher Status\nOutgroup", "Ingroup")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Perceived Status",x="University") + jtools::theme_apa()

Combine Warmth and Status Plots

wsPlot2 <- warmPlot2 + statusPlot2 
wsPlot2

Projection Rates

mDiffPlot2 <- ggplot(params2, aes(condition, m)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + scale_x_discrete(labels=c("Lower Status","Negation", "Higher Status")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Projection Rate",x="University") + jtools::theme_apa()

Bias Parameter

bDiffPlot2 <- ggplot(params2, aes(condition, bias)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + scale_x_discrete(labels=c("Lower Status","Negation", "Higher Status")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Bias Parameter",x="University") + jtools::theme_apa()

Combine Bias and Projection

mbPlot2 <- mDiffPlot2 + bDiffPlot2 
mbPlot2

Desirability Ingroup Classifications

DES.ING.COND.2.p <- conditional_effects(DES.ING.COND.2)#, method = "posterior_linpred")
DES.ING.COND.2.p_ <- DES.ING.COND.2.p$`desirability.Z:outgroup`
DES.ING.COND.2.plot <-ggplot(DES.ING.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.08, .75),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Desirability") + ylab("Ingroup Classification")
DES.ING.COND.2.plot

Self-Evaluation Ingroup Classification

SR.ING.COND.2.p <- conditional_effects(SR.ING.COND.2)#, method = "posterior_linpred")
SR.ING.COND.2.p_ <- SR.ING.COND.2.p$`selfResp.Z:outgroup`
SR.ING.COND.2.plot <-ggplot(SR.ING.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.08, .75),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Self-Evaluation") + ylab("Ingroup Classification")
SR.ING.COND.2.plot

Similarity-to-Self Ingroup Classification

WSR.ING.COND.2.p <- conditional_effects(WSR.ING.COND.2)#, method = "posterior_linpred")
WSR.ING.COND.2.p_ <- WSR.ING.COND.2.p$`WSR.Z:outgroup`
WSR.ING.COND.2.plot <-ggplot(WSR.ING.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.08, .75),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Self") + ylab("Ingroup Classification")
WSR.ING.COND.2.plot

Combine Plots

COMB.ING.COND.2.plot1 <- ggarrange(DES.ING.COND.2.plot, SR.ING.COND.2.plot, WSR.ING.COND.2.plot, labels=c("A","B","C"), nrow=1)
COMB.ING.COND.2.plot2 <- ggarrange(DES.ING.COND.2.plot, SR.ING.COND.2.plot, WSR.ING.COND.2.plot, labels=c("D","E","F"), nrow=1)

Metacontrast Ratio

MCS.SR.COND.2.p <- conditional_effects(MCS.SR.COND.2)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
MCS.SR.COND.2.p_ <- MCS.SR.COND.2.p$`metaContrastS.Z:outgroup`
MCS.SR.COND.2.MCRplot <-ggplot(MCS.SR.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Metacontrast Ratio") + ylab("Self-Evaluation")
MCS.SR.COND.2.MCRplot

Summed Similarity to Outgroup Compared Across Conditions

ISOS.SR.COND.2.p <- conditional_effects(ISOS.SR.COND.2)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.COND.2.p_ <- ISOS.SR.COND.2.p$`inGsimS.Z:outgroup`
ISOS.SR.COND.2.InGplot <-ggplot(ISOS.SR.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Ingroup") + ylab("Self-Evaluation")
ISOS.SR.COND.2.InGplot

Summed Similarity to Outgroup Compared Across Conditions

ISOS.SR.COND.2.p <- conditional_effects(ISOS.SR.COND.2)#, method = "posterior_linpred")
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.COND.2.p_ <- ISOS.SR.COND.2.p$`outGsimS.Z:outgroup`
ISOS.SR.COND.2.OutGplot <-ggplot(ISOS.SR.COND.2.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + 
  geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + 
  scale_linetype_discrete(labels = c("Negation","Lower Status","Higher Status")) + 
  scale_color_manual(labels = c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  scale_fill_manual( 
                      labels=c("Negation","Lower Status","Higher Status"), values = wes_palette("Darjeeling1")) + 
  theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Outgroup") + ylab("Self-Evaluation")
ISOS.SR.COND.2.OutGplot

Study 3

Warmth

warmthDf3 <- pivot_longer(indDiffs3, cols=starts_with("Therm_"), names_to="Group", values_to="Warmth") %>% select(subID, Group, Warmth) %>% drop_na()
warmthDf3$Group <- gsub("Therm_1","White", warmthDf3$Group)
warmthDf3$Group <- gsub("Therm_2","Asian", warmthDf3$Group)
warmthDf3$Group <- gsub("Therm_4","Latino", warmthDf3$Group)

warmthDf3$Group <- as.factor(warmthDf3$Group)
warmthDf3$subID <- as.factor(warmthDf3$subID)

warmPlot3 <- ggplot(warmthDf3, aes(Group, Warmth)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + 
  geom_jitter(width = .05, alpha = .15) + labs(y="Perceived Warmth",x="Racial Group") + jtools::theme_apa()

Status

indDiffs3$Status <- NULL
statusDf3 <- pivot_longer(indDiffs3, cols=ends_with("_Status"), names_to="Group", values_to="Status") %>% select(subID, Group, Status) %>% drop_na()
statusDf3$Group <- gsub("_Status","", statusDf3$Group)

statusDf3$Group <- as.factor(statusDf3$Group)
statusDf3$subID <- as.factor(statusDf3$subID)

statusPlot3 <- ggplot(statusDf3, aes(Group, Status)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + 
  geom_jitter(width = .05, alpha = .3) + labs(y="Perceived Status",x="Racial Group") + jtools::theme_apa()

Combine Warmth and Status Plots

wsPlot3 <- warmPlot3 + statusPlot3
wsPlot3

Projection Rates

mDiffPlot3 <- ggplot(params3, aes(condition, m)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + scale_x_discrete(labels=c("Majority","Minority")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Projection Rate",x="Racial Group") + jtools::theme_apa()

Bias Parameter

bDiffPlot3 <- ggplot(params3, aes(condition, bias)) + 
  ggdist::stat_halfeye(adjust = .5, width = .7, .width = 0, justification = -.2, point_colour = NA) + 
  geom_boxplot(width = .2, outlier.shape = NA) + scale_x_discrete(labels=c("Majority","Minority")) +
  geom_jitter(width = .05, alpha = .15) + labs(y="Bias Parameter",x="Racial Group") + jtools::theme_apa()

Combine Bias and Projection Plots

mbPlot3 <- mDiffPlot3 + bDiffPlot3
mbPlot3

Desirability Ingroup Classification

DES.ING.COND.3.p <- conditional_effects(DES.ING.COND.3)
DES.ING.COND.3.p_ <- DES.ING.COND.3.p$`desirability.Z:condition`
DES.ING.COND.3.plot <-ggplot(DES.ING.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Desirability") + ylab("Ingroup Classification")
DES.ING.COND.3.plot

Self-Evaluation Ingroup Classification

SR.ING.COND.3.p <- conditional_effects(SR.ING.COND.3)
SR.ING.COND.3.p_ <- SR.ING.COND.3.p$`selfResp.Z:condition`
SR.ING.COND.3.plot <-ggplot(SR.ING.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Self-Evaluation") + ylab("Ingroup Classification")
SR.ING.COND.3.plot

Similarity-to-Self Ingroup Classification

WSR.ING.COND.3.p <- conditional_effects(WSR.ING.COND.3)
WSR.ING.COND.3.p_ <- WSR.ING.COND.3.p$`WSR.Z:condition`
WSR.ING.COND.3.plot <-ggplot(WSR.ING.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Self") + ylab("Ingroup Classification")
WSR.ING.COND.3.plot

Combine Plots

COMB.ING.COND.3.plot1 <- ggarrange(DES.ING.COND.3.plot, SR.ING.COND.3.plot, WSR.ING.COND.3.plot, labels=c("A","B","C"), nrow=1)
COMB.ING.COND.3.plot3 <- ggarrange(DES.ING.COND.3.plot, SR.ING.COND.3.plot, WSR.ING.COND.3.plot, labels=c("G","H","I"), nrow=1)

Metacontrast Ratio

MCS.SR.COND.3.p <- conditional_effects(MCS.SR.COND.3)
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
MCS.SR.COND.3.p_ <- MCS.SR.COND.3.p$`metaContrastS.Z:condition`
MCS.SR.COND.3.MCRplot <-ggplot(MCS.SR.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Metacontrast Ratio") + ylab("Self-Evaluation")
MCS.SR.COND.3.MCRplot

Summed Similarity to Ingroup Compared Across Conditions

ISOS.SR.COND.3.p <- conditional_effects(ISOS.SR.COND.3)
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.COND.3.p_ <- ISOS.SR.COND.3.p$`inGsimS.Z:condition`
ISOS.SR.COND.3.InGplot <-ggplot(ISOS.SR.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Ingroup") + ylab("Self-Evaluation")
ISOS.SR.COND.3.InGplot

Summed Similarity to Outgroup Compared Across Conditions

ISOS.SR.COND.3.p <- conditional_effects(ISOS.SR.COND.3)
Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.Warning: Predictions are treated as continuous variables in 'conditional_effects' by default which is likely invalid for ordinal families. Please set 'categorical' to TRUE.
ISOS.SR.COND.3.p_ <- ISOS.SR.COND.3.p$`outGsimS.Z:condition`
ISOS.SR.COND.3.OutGplot <-ggplot(ISOS.SR.COND.3.p_, aes(effect1__, estimate__)) +  geom_line(aes(linetype=effect2__, color=effect2__)) + geom_ribbon(aes(ymin=lower__, ymax=upper__, fill=effect2__), alpha=0.15) + scale_linetype_discrete(labels = c("Majority","Minority")) + scale_color_manual(labels = c("Majority","Minority"), values = c("#44AA99","#332288")) + scale_fill_manual( 
                      labels=c("Majority","Minority"), values = c("#44AA99","#332288")) + theme(
    legend.position = c(.12, .7),
    legend.justification = c("left", "bottom"),
    legend.box.just = "left",
    legend.margin = margin(6, 6, 6, 6)
    ) + theme(axis.text=element_text(size=12),
        axis.title=element_text(size=12,face="bold")) + theme(legend.text = element_text(size=12)) + theme(panel.border = element_rect(colour = "black", fill = NA, size =1)) + theme(legend.title = element_blank()) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  xlab("Similarity-to-Outgroup") + ylab("Self-Evaluation")
ISOS.SR.COND.3.OutGplot

Studies Combined

wsPlot23 <- wsPlot2 / wsPlot3
wsPlot23
ggsave(wsPlot23, file = "/Volumes/Research Project/Self-Anchoring/Plots/warmStatus23.png", dpi = 300, units = "in", width= 10, height = 12)
ggsave(wsPlot23, file = "/Volumes/Research Project/Self-Anchoring/Plots/warmStatus23.tiff", dpi = 300, units = "in", width= 10, height = 12)

mbPlot23 <- mbPlot2 / mbPlot3
mbPlot23
ggsave(mbPlot23, file = "/Volumes/Research Project/Self-Anchoring/Plots/projBias23.png", dpi = 300, units = "in", width= 12, height = 9)
ggsave(mbPlot23, file = "/Volumes/Research Project/Self-Anchoring/Plots/projBias23.tiff", dpi = 300, units = "in", width= 12, height = 9)

COMB.ING.ALL <- ggarrange(COMB.ING.1.plot1, COMB.ING.COND.2.plot2, COMB.ING.COND.3.plot3, nrow =3)

ggsave(COMB.ING.ALL, file = "/Volumes/Research Project/Self-Anchoring/Plots/testPlot.png", dpi = 300, units = "in", width= 11, height = 14)

ggsave(COMB.ING.ALL, file = "/Volumes/Research Project/Self-Anchoring/Plots/testPlot.tiff", dpi = 300, units = "in", width= 11, height = 14)
trainingPlots <- ggpubr::ggarrange(MCS.SR.COND.2.MCRplot, ISOS.SR.COND.2.InGplot, ISOS.SR.COND.2.OutGplot,
          MCS.SR.COND.3.MCRplot, ISOS.SR.COND.3.InGplot, ISOS.SR.COND.3.OutGplot,
          labels = c("A", "B", "C", "D", "E", "F"),
          nrow = 2, ncol = 3)

ggsave(trainingPlots, file = "/Volumes/Research Project/Self-Anchoring/Plots/trainPlot.png", dpi = 300, units = "in", width= 10, height = 9)

ggsave(trainingPlots, file = "/Volumes/Research Project/Self-Anchoring/Plots/trainPlot.tiff", dpi = 300, units = "in", width= 10, height = 9)

For Talk

Study-Specific Generalization Phase Plots

SR.ING.1.plot + SR.ING.COND.2.plot + SR.ING.COND.3.plot
ggsave(file = "~/Desktop/SR.ING.png", dpi = 300, units = "in", width= 16, height = 5)


DES.ING.1.plot + DES.ING.COND.2.plot + DES.ING.COND.3.plot
ggsave(file = "~/Desktop/DES.ING.png", dpi = 300, units = "in", width= 16, height = 5)


WSR.ING.1.plot + WSR.ING.COND.2.plot + WSR.ING.COND.3.plot
ggsave(file = "~/Desktop/WSR.ING.png", dpi = 300, units = "in", width= 16, height = 5)

Study-Specific Training Phase Plots

MCS.SR.1.MCRplot + MCS.SR.COND.2.MCRplot + MCS.SR.COND.3.MCRplot
ggsave(file = "~/Desktop/MCS.SR.png", dpi = 300, units = "in", width= 16, height = 5)


ISOS.SR.1.InGplot + ISOS.SR.COND.2.InGplot + ISOS.SR.COND.3.InGplot
ggsave(file = "~/Desktop/InG.SR.png", dpi = 300, units = "in", width= 16, height = 5)


ISOS.SR.1.OutGplot + ISOS.SR.COND.2.OutGplot + ISOS.SR.COND.3.OutGplot
ggsave(file = "~/Desktop/OutG.SR.png", dpi = 300, units = "in", width= 16, height = 5)

wsPlot2
ggsave(file = "~/Desktop/wsPlot2.png", dpi = 300, units = "in", width= 10, height = 5)


wsPlot3
ggsave(file = "~/Desktop/wsPlot3.png", dpi = 300, units = "in", width= 10, height = 5)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiMgbG9hZCgiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9Db21iaW5lZC9Db21iaW5lZC9yZXBvcnRpbmdBbmFseXNlc0Vudi5SRGF0YSIpCmBgYAoKYGBge3J9CmxpYnJhcnkocGFjbWFuKQpwX2xvYWQodGlkeXZlcnNlLCBnZ2Rpc3QsIHdlc2FuZGVyc29uLCBwYXRjaHdvcmssIGJybXMsIGlncmFwaCwgR0dhbGx5LCBnZ3JlcGVsLCBuZXR3b3JrLCBzbmEsIGhlcmUsIHBlcmZvcm1hbmNlLCBnZ3B1YnIpCmBgYAoKYGBge3J9CnBhcmFtcy5VQ0xBIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoaGVyZTo6aGVyZSgiU3R1ZHkgMi9DbGVhbmluZy9vdXRwdXQvU19Mb2dpc3RpY18xbV9PcHBvc2VfQmlhc3BhcmFtcy5VQ0xBLnBhcnF1ZXQiKSkKcGFyYW1zLkNTVUxBIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoaGVyZTo6aGVyZSgiU3R1ZHkgMi9DbGVhbmluZy9vdXRwdXQvU19Mb2dpc3RpY18xbV9PcHBvc2VfQmlhc3BhcmFtcy5DU1VMQS5wYXJxdWV0IikpCnBhcmFtcy5Ob3RVQ1IgPC0gYXJyb3c6OnJlYWRfcGFycXVldChoZXJlOjpoZXJlKCJTdHVkeSAyL0NsZWFuaW5nL291dHB1dC9TX0xvZ2lzdGljXzFtX09wcG9zZV9CaWFzcGFyYW1zLk5vdFVDUi5wYXJxdWV0IikpCnBhcmFtczIgPC0gcmJpbmQoCiAgY2JpbmQocGFyYW1zLlVDTEEsY29uZGl0aW9uPSJVQ0xBIiksCiAgY2JpbmQocGFyYW1zLkNTVUxBLGNvbmRpdGlvbj0iQ1NVIExBIiksCiAgY2JpbmQocGFyYW1zLk5vdFVDUixjb25kaXRpb249Ik5vdCBVQ1IiKQogICkKCnBhcmFtcy5NYWpvcml0eSA8LSBhcnJvdzo6cmVhZF9wYXJxdWV0KGhlcmU6OmhlcmUoIlN0dWR5IDMvQ2xlYW5pbmcvb3V0cHV0L1NfTG9naXN0aWNfMW1fT3Bwb3NlX0JpYXNwYXJhbXMuTWFqb3JpdHkucGFycXVldCIpKQpwYXJhbXMuTWlub3JpdHkgPC0gYXJyb3c6OnJlYWRfcGFycXVldChoZXJlOjpoZXJlKCJTdHVkeSAzL0NsZWFuaW5nL291dHB1dC9TX0xvZ2lzdGljXzFtX09wcG9zZV9CaWFzcGFyYW1zLk1pbm9yaXR5LnBhcnF1ZXQiKSkKcGFyYW1zMyA8LSByYmluZCgKICBjYmluZChwYXJhbXMuTWFqb3JpdHksY29uZGl0aW9uPSJNYWpvcml0eSIpLAogIGNiaW5kKHBhcmFtcy5NaW5vcml0eSxjb25kaXRpb249Ik1pbm9yaXR5IikKICApCgojIHBhcmFtczMgPC0gcmJpbmQoCiMgICBjYmluZChwYXJhbXMuTWFqb3JpdHkpLCMsY29uZGl0aW9uPSJNYWpvcml0eSIpLAojICAgY2JpbmQocGFyYW1zLk1pbm9yaXR5KSMsY29uZGl0aW9uPSJNaW5vcml0eSIpCiMgICApCmBgYAoKCmxvYWQgYWRqZW5jZW5jeSBtYXRyaXggZm9yIHBvc2l0aXZlCmBgYHtyfQojcG9zX2FkaiA8LSByZWFkLmNzdigiaW5wdXQvcG9zX2Fkai5jc3YiKQpwb3NfYWRqIDwtIHJlYWQuY3N2KGhlcmUoIkNvbWJpbmVkL2lucHV0L2FkamFjZW5jeU1hdHJpeF9wLmNzdiIpKQpjb2xuYW1lcyhwb3NfYWRqKSA8LSAxOjE0OApwb3NfYWRqIDwtIGFzLm1hdHJpeChwb3NfYWRqKQojcG9zX2F0dCA8LSByZWFkLmNzdigiaW5wdXQvdHJhaXRMZXZlbEF0dHJpYnV0ZV9wLmNzdiIpCnBvc19hdHQgPC0gcmVhZC5jc3YoaGVyZSgiQ29tYmluZWQvaW5wdXQvYWxsUG9zQ2VudHMuY3N2IikpCiMgZ2VuZXJhdGUgZ3JhcGggb2JqZWN0IGZyb20gdGhlIG1hdHJpeApncmFwaF9wb3MgPC0gZ3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KHBvc19hZGosIG1vZGUgPSAiZGlyZWN0ZWQiLCB3ZWlnaHRlZD1OVUxMKQpWKGdyYXBoX3BvcykkdE5hbWVzIDwtIHBvc19hdHQkdHJhaXQKcG9zX2F0dCR0cmFpdEZyaWVuZGx5IDwtIHBvc19hdHQkdHJhaXQKcG9zX2F0dCR0cmFpdEZyaWVuZGx5W3Bvc19hdHQkdHJhaXRGcmllbmRseSE9IkZyaWVuZGx5Il0gPC0gIiIKVihncmFwaF9wb3MpJEZyaWVuZGx5TmFtZSA8LSBwb3NfYXR0JHRyYWl0RnJpZW5kbHkKYGBgCgoKIyBGb2N1cyBvbiAiRnJpZW5kbHkiIC0gSGlnaCBvdXRkZWdyZWUgY2VudHJhbGl0eSB0cmFpdAoKYGBge3J9CkZyaWVuZGx5TmV0IDwtIGVnbyhncmFwaF9wb3MsIG9yZGVyID0gMSwgbm9kZXMgPSA0NiwgbW9kZSA9ICJhbGwiLAogIG1pbmRpc3QgPSAwKQpGcmllbmRseU5ldCA8LSBpbmR1Y2VkLnN1YmdyYXBoKGdyYXBoX3BvcywgdmlkcyA9IHVubGlzdChGcmllbmRseU5ldCkgKQoKc2V0LnNlZWQoMikKCmVnb05ldCA8LSBnZ25ldDIoRnJpZW5kbHlOZXQsIHNpemUgPSAib3V0ZGVncmVlIiwgIGNvbG9yID0gImRvZGdlcmJsdWUiLCAgcGFsZXR0ZSA9ICJTZXQyIiwgbW9kZSA9ICJmcnVjaHRlcm1hbnJlaW5nb2xkIiwgZGlyZWN0ZWQ9VFJVRSwgYXJyb3cuc2l6ZSA9IDMsIGFycm93LmdhcCA9IDAuMDI1LCBsYXlvdXQuZXhwID0gLjM1LCBhbHBoYSA9IC43LCBlZGdlLmFscGhhID0gLjQ1KSArIAogIGd1aWRlcyhjb2xvciA9IEZBTFNFLCBzaXplID0gRkFMU0UpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IFYoRnJpZW5kbHlOZXQpJHROYW1lcyksIHNpemUgPSAzLjUsIGZvcmNlID0gLjAyNSwgZm9udGZhY2UgPSAiYm9sZCIpCmVnb05ldAoKZ2dzYXZlKGVnb05ldCwgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL291dGRlZ3JlZU5ldC5wbmciLCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCwgd2lkdGg9IDYsIGhlaWdodCA9IDQpCgpnZ3NhdmUoZWdvTmV0LCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvb3V0ZGVncmVlTmV0LnRpZmYiLCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCwgd2lkdGg9IDYsIGhlaWdodCA9IDQpCmBgYAoKCiMgRmVlZGJhY2sgQ29tbXVuaXR5IENvbG9yZWQKCmBgYHtyfQpsaWJyYXJ5KHdlc2FuZGVyc29uKQoKZ3JhcGhfcG9zMiA8LSBpbnRlcmdyYXBoOjphc05ldHdvcmsoZ3JhcGhfcG9zKQojZ3JhcGhfcG9zMiAldiUgImNsdXN0ZXIiID0gYXMuY2hhcmFjdGVyKFYoZ3JhcGhfcG9zKSRjbHVzdGVyKQoKc2V0LnNlZWQoNSkKCnAxIDwtIGdnbmV0MihncmFwaF9wb3MyLCBzaXplID0gIm91dGRlZ3JlZSIsICBjb2xvciA9ICJkb2RnZXJibHVlIiwgcGFsZXR0ZSA9ICJEYXJrMiIsIG1vZGUgPSAia2FtYWRha2F3YWkiLCBkaXJlY3RlZD1UUlVFLCBsYXlvdXQuZXhwID0gLjY1LCBhbHBoYSA9IC43LCBlZGdlLmFscGhhID0gLjI1KSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UsIHNpemUgPSBGQUxTRSkKcDEKCmdnc2F2ZShwMSwgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL2NvbG9yTmV0LnBuZyIsIHVuaXRzID0gImluIiwgZHBpID0gMzAwLCB3aWR0aD0gNiwgaGVpZ2h0ID0gNCkKCmdnc2F2ZShwMSwgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL2NvbG9yTmV0LnRpZmYiLCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCwgd2lkdGg9IDYsIGhlaWdodCA9IDQpCmBgYAoKYGBge3J9CnN0YWNrIDwtIGdncHVicjo6Z2dhcnJhbmdlKHAxLCBlZ29OZXQsIG5jb2w9MSwgbnJvdz0yKQoKZ2dzYXZlKHN0YWNrLCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvc3RhY2tOZXR3b3JrLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gOCwgaGVpZ2h0ID0gMTApCgpnZ3NhdmUoc3RhY2ssIGZpbGUgPSAiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9QbG90cy9zdGFja05ldHdvcmsudGlmZiIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gOCwgaGVpZ2h0ID0gMTApCmBgYAoKIyBQcm9iYWJpbGl0eSBvZiBTaWduaWZpY2FuY2UKCmBgYHtyfQpsaWJyYXJ5KGJheWVzdGVzdFIpCnBzMSA8LSBiYXllc3Rlc3RSOjpwX3NpZ25pZmljYW5jZShXU1JOT1YuSU5HKQpQUzEuV1NSTk9WLklORyA8LSBwbG90KHBzMSkgKyBqdG9vbHM6OnRoZW1lX2FwYSgpICsgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJTaW1pbGFyaXR5LXRvLVNlbGZcblggTm92ZWwiLCJOb3ZlbCIsIlNpbWlsYXJpdHktdG8tU2VsZiIpKSArIHhsYWIoZXhwcmVzc2lvbihiZXRhKSkgKyB5bGFiKCJGaXhlZCBFZmZlY3RzIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAuMTgpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLS4xOCkgKyBqdG9vbHM6OnRoZW1lX2FwYSgpICsgZ2d0aXRsZShOVUxMKQoKZ2dzYXZlKFBTMS5XU1JOT1YuSU5HLCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvUFNwbG90LnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gNy41LCBoZWlnaHQgPTQuNSkKCmdnc2F2ZShQUzEuV1NSTk9WLklORywgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL1BTcGxvdC50aWZmIiwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIsIHdpZHRoPSA3LjUsIGhlaWdodCA9NC41KQoKcHMxIDwtIGJheWVzdGVzdFI6OnBfc2lnbmlmaWNhbmNlKFdTUk5PVi5JTkcpClBTMS5XU1JOT1YuSU5HIDwtIHBsb3QocHMxKSArIGp0b29sczo6dGhlbWVfYXBhKCkgKyBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscyA9IGMoIlNpbWlsYXJpdHktdG8tU2VsZlxuWCBOb3ZlbCIsIk5vdmVsIiwiU2ltaWxhcml0eS10by1TZWxmIikpICsgeGxhYihleHByZXNzaW9uKGJldGEpKSArIHlsYWIoIkZpeGVkIEVmZmVjdHMiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC4xOCkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtLjE4KSArIGp0b29sczo6dGhlbWVfYXBhKCkgKyBnZ3RpdGxlKE5VTEwpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicmVkIiwicmVkIiwiYmx1ZSIpKQoKcHMyIDwtIGJheWVzdGVzdFI6OnBfc2lnbmlmaWNhbmNlKFdTUk5PVi5JTkcuMikKUFMyLldTUk5PVi5JTkcgPC0gcGxvdChwczIpICsganRvb2xzOjp0aGVtZV9hcGEoKSArIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gYygiU2ltaWxhcml0eS10by1TZWxmXG5YIE5vdmVsIiwiTm92ZWwiLCJTaW1pbGFyaXR5LXRvLVNlbGYiKSkgKyB4bGFiKGV4cHJlc3Npb24oYmV0YSkpICsgeWxhYigiRml4ZWQgRWZmZWN0cyIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLjE4KSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0uMTgpICsganRvb2xzOjp0aGVtZV9hcGEoKSArIGdndGl0bGUoTlVMTCkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCJibHVlIiwiYmx1ZSIpKQoKcHMzIDwtIGJheWVzdGVzdFI6OnBfc2lnbmlmaWNhbmNlKFdTUk5PVi5JTkcuMykKUFMzLldTUk5PVi5JTkcgPC0gcGxvdChwczMpICsganRvb2xzOjp0aGVtZV9hcGEoKSArIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gYygiU2ltaWxhcml0eS10by1TZWxmXG5YIE5vdmVsIiwiTm92ZWwiLCJTaW1pbGFyaXR5LXRvLVNlbGYiKSkgKyB4bGFiKGV4cHJlc3Npb24oYmV0YSkpICsgeWxhYigiRml4ZWQgRWZmZWN0cyIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLjE4KSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0uMTgpICsganRvb2xzOjp0aGVtZV9hcGEoKSArIGdndGl0bGUoTlVMTCkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCJibHVlIiwiYmx1ZSIpKQoKZ2dwdWJyOjpnZ2FycmFuZ2UoUFMxLldTUk5PVi5JTkcsIFBTMi5XU1JOT1YuSU5HLCBQUzMuV1NSTk9WLklORywgbnJvdz0zLCBuY29sPTEpCgpnZ3NhdmUoIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvUFNfU3RhY2sucG5nIiwgaGVpZ2h0ID0gOCwgd2lkdGggPSA5LCB1bml0cyA9ICJpbiIpCmdnc2F2ZSgiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9QbG90cy9QU19TdGFjay50aWZmIiwgaGVpZ2h0ID0gOCwgd2lkdGggPSA5LCB1bml0cyA9ICJpbiIpCmBgYAoKIyBQb3N0ZXJpb3IgUHJlZGljdGl2ZSBDaGVjawoKYGBge3J9CklORzFQUEMgPC0gcG9zdGVyaW9yX3ByZWRpY3RpdmVfY2hlY2soV1NSLklORykgKyBqdG9vbHM6OnRoZW1lX2FwYSgpCklORzJQUEMgPC0gcG9zdGVyaW9yX3ByZWRpY3RpdmVfY2hlY2soV1NSLklORy5DT05ELjIpICsganRvb2xzOjp0aGVtZV9hcGEoKQpJTkczUFBDIDwtIHBvc3Rlcmlvcl9wcmVkaWN0aXZlX2NoZWNrKFdTUi5JTkcuQ09ORC4zKSArIGp0b29sczo6dGhlbWVfYXBhKCkKClNSMVBQQyA8LSBwb3N0ZXJpb3JfcHJlZGljdGl2ZV9jaGVjayhNQ1MuU1IpICsganRvb2xzOjp0aGVtZV9hcGEoKQpTUjJQUEMgPC0gcG9zdGVyaW9yX3ByZWRpY3RpdmVfY2hlY2soTUNTLlNSLkNPTkQuMikgKyBqdG9vbHM6OnRoZW1lX2FwYSgpClNSM1BQQyA8LSBwb3N0ZXJpb3JfcHJlZGljdGl2ZV9jaGVjayhNQ1MuU1IuQ09ORC4zKSArIGp0b29sczo6dGhlbWVfYXBhKCkKCkNPTUJQUEMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoSU5HMVBQQywgSU5HMlBQQywgSU5HM1BQQywgU1IxUFBDLCBTUjJQUEMsIFNSM1BQQywgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiKSwgbnJvdyA9IDIsIG5jb2wgPTMsIGNvbW1vbi5sZWdlbmQgPSBUKQoKZ2dzYXZlKENPTUJQUEMsIGZpbGUgPSAiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9QbG90cy9QUENwbG90LnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTAsIGhlaWdodCA9IDkpCgpnZ3NhdmUoQ09NQlBQQywgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL1BQQ3Bsb3QudGlmZiIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTAsIGhlaWdodCA9IDkpCmBgYAojIFN0dWR5IDEKCiMjIFNlbGYtRXZhbHVhdGlvbiBJbmdyb3VwIENsYXNzaWZpY2F0aW9uCgpgYGB7cn0KREVTLklORy4xLnAgPC0gY29uZGl0aW9uYWxfZWZmZWN0cyhERVMuSU5HKSMsIG1ldGhvZCA9ICJwb3N0ZXJpb3JfbGlucHJlZCIpCkRFUy5JTkcuMS5wXyA8LSBERVMuSU5HLjEucCRgZGVzaXJhYmlsaXR5LlpgCkRFUy5JTkcuMS5wbG90IDwtZ2dwbG90KERFUy5JTkcuMS5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMoKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18pLCBhbHBoYT0wLjE1KSArIAogIHRoZW1lKAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIkRlc2lyYWJpbGl0eSIpICsgeWxhYigiSW5ncm91cCBDbGFzc2lmaWNhdGlvbiIpCkRFUy5JTkcuMS5wbG90CmBgYAoKIyMgU2VsZi1FdmFsdWF0aW9uIEluZ3JvdXAgQ2xhc3NpZmljYXRpb24KCmBgYHtyfQpTUi5JTkcuMS5wIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoU0VMRi5JTkcpIywgbWV0aG9kID0gInBvc3Rlcmlvcl9saW5wcmVkIikKU1IuSU5HLjEucF8gPC0gU1IuSU5HLjEucCRgc2VsZlJlc3AuWmAKU1IuSU5HLjEucGxvdCA8LWdncGxvdChTUi5JTkcuMS5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMoKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18pLCBhbHBoYT0wLjE1KSArIAogIHRoZW1lKAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIlNlbGYtRXZhbHVhdGlvbiIpICsgeWxhYigiSW5ncm91cCBDbGFzc2lmaWNhdGlvbiIpClNSLklORy4xLnBsb3QKYGBgCgojIyBTaW1pbGFyaXR5LXRvLVNlbGYgSW5ncm91cCBDbGFzc2lmaWNhdGlvbgoKYGBge3J9CldTUi5JTkcuMS5wIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoV1NSLklORykjLCBtZXRob2QgPSAicG9zdGVyaW9yX2xpbnByZWQiKQpXU1IuSU5HLjEucF8gPC0gV1NSLklORy4xLnAkYFdTUi5aYApXU1IuSU5HLjEucGxvdCA8LWdncGxvdChXU1IuSU5HLjEucF8sIGFlcyhlZmZlY3QxX18sIGVzdGltYXRlX18pKSArICBnZW9tX2xpbmUoYWVzKCkpICsgCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bG93ZXJfXywgeW1heD11cHBlcl9fKSwgYWxwaGE9MC4xNSkgKyAKICB0aGVtZSgKICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oNiwgNiwgNiwgNikKICAgICkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJTaW1pbGFyaXR5LXRvLVNlbGYiKSArIHlsYWIoIkluZ3JvdXAgQ2xhc3NpZmljYXRpb24iKQpXU1IuSU5HLjEucGxvdApgYGAKCiMjIENvbWJpbmUgUGxvdHMKCmBgYHtyfQpDT01CLklORy4xLnBsb3QxIDwtIGdnYXJyYW5nZShERVMuSU5HLjEucGxvdCwgU1IuSU5HLjEucGxvdCwgV1NSLklORy4xLnBsb3QsIGxhYmVscz1jKCJBIiwiQiIsIkMiKSwgbnJvdz0xKQpgYGAKCiMjIE1ldGFjb250cmFzdCBSYXRpbwoKYGBge3J9Ck1DUy5TUi4xLnAgPC0gY29uZGl0aW9uYWxfZWZmZWN0cyhNQ1MuU1IpIywgbWV0aG9kID0gInBvc3Rlcmlvcl9saW5wcmVkIikKTUNTLlNSLjEucF8gPC0gTUNTLlNSLjEucCRgbWV0YUNvbnRyYXN0Uy5aYApNQ1MuU1IuMS5NQ1JwbG90IDwtZ2dwbG90KE1DUy5TUi4xLnBfLCBhZXMoZWZmZWN0MV9fLCBlc3RpbWF0ZV9fKSkgKyAgZ2VvbV9saW5lKGFlcygpKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXyksIGFscGhhPTAuMTUpICsKICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJNZXRhY29udHJhc3QgUmF0aW8iKSArIHlsYWIoIlNlbGYtRXZhbHVhdGlvbiIpCk1DUy5TUi4xLk1DUnBsb3QKYGBgCgojIyBTaW1pbGFyaXR5LXRvLUluZ3JvdXAKCmBgYHtyfQpJU09TLlNSLjEucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKElTT1MuU1IpIywgbWV0aG9kID0gInBvc3Rlcmlvcl9saW5wcmVkIikKSVNPUy5TUi4xLnBfIDwtIElTT1MuU1IuMS5wJGBpbkdzaW1TLlpgCklTT1MuU1IuMS5JbkdwbG90IDwtZ2dwbG90KElTT1MuU1IuMS5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMoKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18pLCBhbHBoYT0wLjE1KSArCiAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLGZhY2U9ImJvbGQiKSkgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaXplID0xKSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgeGxhYigiU2ltaWxhcml0eS10by1Jbmdyb3VwIikgKyB5bGFiKCJTZWxmLUV2YWx1YXRpb24iKQpJU09TLlNSLjEuSW5HcGxvdApgYGAKCiMjIFNpbWlsYXJpdHktdG8tT3V0Z3JvdXAKCmBgYHtyfQpJU09TLlNSLjEucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKElTT1MuU1IpIywgbWV0aG9kID0gInBvc3Rlcmlvcl9saW5wcmVkIikKSVNPUy5TUi4xLnBfIDwtIElTT1MuU1IuMS5wJGBvdXRHc2ltUy5aYApJU09TLlNSLjEuT3V0R3Bsb3QgPC1nZ3Bsb3QoSVNPUy5TUi4xLnBfLCBhZXMoZWZmZWN0MV9fLCBlc3RpbWF0ZV9fKSkgKyAgZ2VvbV9saW5lKGFlcygpKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXyksIGFscGhhPTAuMTUpICsKICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJTaW1pbGFyaXR5LXRvLU91dGdyb3VwIikgKyB5bGFiKCJTZWxmLUV2YWx1YXRpb24iKQpJU09TLlNSLjEuT3V0R3Bsb3QKYGBgCgojIFN0dWR5IDIKCiMjIFdhcm10aAoKYGBge3J9Cndhcm10aERmIDwtIHBpdm90X2xvbmdlcihpbmREaWZmczIsIGNvbHM9c3RhcnRzX3dpdGgoIlRoZXJtXyIpLCBuYW1lc190bz0iVW5pdmVyc2l0eSIsIHZhbHVlc190bz0iV2FybXRoIikgJT4lIHNlbGVjdChzdWJJRCwgVW5pdmVyc2l0eSwgV2FybXRoKSAlPiUgZHJvcF9uYSgpCndhcm10aERmJFVuaXZlcnNpdHkgPC0gZ3N1YigiVGhlcm1fMSIsIlVDUiIsIHdhcm10aERmJFVuaXZlcnNpdHkpCndhcm10aERmJFVuaXZlcnNpdHkgPC0gZ3N1YigiVGhlcm1fMiIsIlVDTEEiLCB3YXJtdGhEZiRVbml2ZXJzaXR5KQp3YXJtdGhEZiRVbml2ZXJzaXR5IDwtIGdzdWIoIlRoZXJtXzQiLCJDU1UgTEEiLCB3YXJtdGhEZiRVbml2ZXJzaXR5KQoKd2FybVBsb3QyIDwtIGdncGxvdCh3YXJtdGhEZiwgYWVzKFVuaXZlcnNpdHksIFdhcm10aCkpICsgCiAgZ2dkaXN0OjpzdGF0X2hhbGZleWUoYWRqdXN0ID0gLjUsIHdpZHRoID0gLjcsIC53aWR0aCA9IDAsIGp1c3RpZmljYXRpb24gPSAtLjIsIHBvaW50X2NvbG91ciA9IE5BKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IC4yLCBvdXRsaWVyLnNoYXBlID0gTkEpICArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvd2VyIFN0YXR1c1xuT3V0Z3JvdXAiLCJIaWdoZXIgU3RhdHVzXG5PdXRncm91cCIsICJJbmdyb3VwIikpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IC4wNSwgYWxwaGEgPSAuMTUpICsgbGFicyh5PSJQZXJjZWl2ZWQgV2FybXRoIix4PSJVbml2ZXJzaXR5IikgKyBqdG9vbHM6OnRoZW1lX2FwYSgpCmBgYAoKIyMgU3RhdHVzCgpgYGB7cn0KaW5kRGlmZnMyJFN0YXR1cyA8LSBOVUxMCnN0YXR1c0RmIDwtIHBpdm90X2xvbmdlcihpbmREaWZmczIsIGNvbHM9ZW5kc193aXRoKCJfU3RhdHVzIiksIG5hbWVzX3RvPSJVbml2ZXJzaXR5IiwgdmFsdWVzX3RvPSJTdGF0dXMiKSAlPiUgc2VsZWN0KHN1YklELCBVbml2ZXJzaXR5LCBTdGF0dXMpICU+JSBkcm9wX25hKCkKc3RhdHVzRGYkVW5pdmVyc2l0eSA8LSBnc3ViKCJfU3RhdHVzIiwiIiwgc3RhdHVzRGYkVW5pdmVyc2l0eSkKCnN0YXR1c0RmJFVuaXZlcnNpdHkgPC0gYXMuZmFjdG9yKHN0YXR1c0RmJFVuaXZlcnNpdHkpCnN0YXR1c0RmJHN1YklEIDwtIGFzLmZhY3RvcihzdGF0dXNEZiRzdWJJRCkKCnN0YXR1c1Bsb3QyIDwtIGdncGxvdChzdGF0dXNEZiwgYWVzKFVuaXZlcnNpdHksIFN0YXR1cykpICsgCiAgZ2dkaXN0OjpzdGF0X2hhbGZleWUoYWRqdXN0ID0gLjUsIHdpZHRoID0gLjcsIC53aWR0aCA9IDAsIGp1c3RpZmljYXRpb24gPSAtLjIsIHBvaW50X2NvbG91ciA9IE5BKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IC4yLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTG93ZXIgU3RhdHVzXG5PdXRncm91cCIsIkhpZ2hlciBTdGF0dXNcbk91dGdyb3VwIiwgIkluZ3JvdXAiKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gLjA1LCBhbHBoYSA9IC4xNSkgKyBsYWJzKHk9IlBlcmNlaXZlZCBTdGF0dXMiLHg9IlVuaXZlcnNpdHkiKSArIGp0b29sczo6dGhlbWVfYXBhKCkKYGBgCgojIyBDb21iaW5lIFdhcm10aCBhbmQgU3RhdHVzIFBsb3RzCgpgYGB7cn0Kd3NQbG90MiA8LSB3YXJtUGxvdDIgKyBzdGF0dXNQbG90MiAKd3NQbG90MgpgYGAKCiMjIFByb2plY3Rpb24gUmF0ZXMKCmBgYHtyfQptRGlmZlBsb3QyIDwtIGdncGxvdChwYXJhbXMyLCBhZXMoY29uZGl0aW9uLCBtKSkgKyAKICBnZ2Rpc3Q6OnN0YXRfaGFsZmV5ZShhZGp1c3QgPSAuNSwgd2lkdGggPSAuNywgLndpZHRoID0gMCwganVzdGlmaWNhdGlvbiA9IC0uMiwgcG9pbnRfY29sb3VyID0gTkEpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJMb3dlciBTdGF0dXMiLCJOZWdhdGlvbiIsICJIaWdoZXIgU3RhdHVzIikpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IC4wNSwgYWxwaGEgPSAuMTUpICsgbGFicyh5PSJQcm9qZWN0aW9uIFJhdGUiLHg9IlVuaXZlcnNpdHkiKSArIGp0b29sczo6dGhlbWVfYXBhKCkKYGBgCgojIyBCaWFzIFBhcmFtZXRlcgoKYGBge3J9CmJEaWZmUGxvdDIgPC0gZ2dwbG90KHBhcmFtczIsIGFlcyhjb25kaXRpb24sIGJpYXMpKSArIAogIGdnZGlzdDo6c3RhdF9oYWxmZXllKGFkanVzdCA9IC41LCB3aWR0aCA9IC43LCAud2lkdGggPSAwLCBqdXN0aWZpY2F0aW9uID0gLS4yLCBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAuMiwgb3V0bGllci5zaGFwZSA9IE5BKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkxvd2VyIFN0YXR1cyIsIk5lZ2F0aW9uIiwgIkhpZ2hlciBTdGF0dXMiKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gLjA1LCBhbHBoYSA9IC4xNSkgKyBsYWJzKHk9IkJpYXMgUGFyYW1ldGVyIix4PSJVbml2ZXJzaXR5IikgKyBqdG9vbHM6OnRoZW1lX2FwYSgpCmBgYAoKIyMgQ29tYmluZSBCaWFzIGFuZCBQcm9qZWN0aW9uCgpgYGB7cn0KbWJQbG90MiA8LSBtRGlmZlBsb3QyICsgYkRpZmZQbG90MiAKbWJQbG90MgpgYGAKCiMjIERlc2lyYWJpbGl0eSBJbmdyb3VwIENsYXNzaWZpY2F0aW9ucwoKYGBge3J9CkRFUy5JTkcuQ09ORC4yLnAgPC0gY29uZGl0aW9uYWxfZWZmZWN0cyhERVMuSU5HLkNPTkQuMikjLCBtZXRob2QgPSAicG9zdGVyaW9yX2xpbnByZWQiKQpERVMuSU5HLkNPTkQuMi5wXyA8LSBERVMuSU5HLkNPTkQuMi5wJGBkZXNpcmFiaWxpdHkuWjpvdXRncm91cGAKREVTLklORy5DT05ELjIucGxvdCA8LWdncGxvdChERVMuSU5HLkNPTkQuMi5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMobGluZXR5cGU9ZWZmZWN0Ml9fLCBjb2xvcj1lZmZlY3QyX18pKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXywgZmlsbD1lZmZlY3QyX18pLCBhbHBoYT0wLjE1KSArIAogIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGlvbiIsIkxvd2VyIFN0YXR1cyIsIkhpZ2hlciBTdGF0dXMiKSwgdmFsdWVzID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcxIikpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwoIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKyAKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjA4LCAuNzUpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJsZWZ0IiwgImJvdHRvbSIpLAogICAgbGVnZW5kLmJveC5qdXN0ID0gImxlZnQiLAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIkRlc2lyYWJpbGl0eSIpICsgeWxhYigiSW5ncm91cCBDbGFzc2lmaWNhdGlvbiIpCkRFUy5JTkcuQ09ORC4yLnBsb3QKYGBgCgojIyBTZWxmLUV2YWx1YXRpb24gSW5ncm91cCBDbGFzc2lmaWNhdGlvbgoKYGBge3J9ClNSLklORy5DT05ELjIucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKFNSLklORy5DT05ELjIpIywgbWV0aG9kID0gInBvc3Rlcmlvcl9saW5wcmVkIikKU1IuSU5HLkNPTkQuMi5wXyA8LSBTUi5JTkcuQ09ORC4yLnAkYHNlbGZSZXNwLlo6b3V0Z3JvdXBgClNSLklORy5DT05ELjIucGxvdCA8LWdncGxvdChTUi5JTkcuQ09ORC4yLnBfLCBhZXMoZWZmZWN0MV9fLCBlc3RpbWF0ZV9fKSkgKyAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1lZmZlY3QyX18sIGNvbG9yPWVmZmVjdDJfXykpICsgCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bG93ZXJfXywgeW1heD11cHBlcl9fLCBmaWxsPWVmZmVjdDJfXyksIGFscGhhPTAuMTUpICsgCiAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobGFiZWxzID0gYygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIikpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMSIpKSArIAogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMDgsIC43NSksCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoImxlZnQiLCAiYm90dG9tIiksCiAgICBsZWdlbmQuYm94Lmp1c3QgPSAibGVmdCIsCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKDYsIDYsIDYsIDYpCiAgICApICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLGZhY2U9ImJvbGQiKSkgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaXplID0xKSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgeGxhYigiU2VsZi1FdmFsdWF0aW9uIikgKyB5bGFiKCJJbmdyb3VwIENsYXNzaWZpY2F0aW9uIikKU1IuSU5HLkNPTkQuMi5wbG90CmBgYAoKCiMjIFNpbWlsYXJpdHktdG8tU2VsZiBJbmdyb3VwIENsYXNzaWZpY2F0aW9uCgpgYGB7cn0KV1NSLklORy5DT05ELjIucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKFdTUi5JTkcuQ09ORC4yKSMsIG1ldGhvZCA9ICJwb3N0ZXJpb3JfbGlucHJlZCIpCldTUi5JTkcuQ09ORC4yLnBfIDwtIFdTUi5JTkcuQ09ORC4yLnAkYFdTUi5aOm91dGdyb3VwYApXU1IuSU5HLkNPTkQuMi5wbG90IDwtZ2dwbG90KFdTUi5JTkcuQ09ORC4yLnBfLCBhZXMoZWZmZWN0MV9fLCBlc3RpbWF0ZV9fKSkgKyAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1lZmZlY3QyX18sIGNvbG9yPWVmZmVjdDJfXykpICsgCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bG93ZXJfXywgeW1heD11cHBlcl9fLCBmaWxsPWVmZmVjdDJfXyksIGFscGhhPTAuMTUpICsgCiAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobGFiZWxzID0gYygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIikpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMSIpKSArIAogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMDgsIC43NSksCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoImxlZnQiLCAiYm90dG9tIiksCiAgICBsZWdlbmQuYm94Lmp1c3QgPSAibGVmdCIsCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKDYsIDYsIDYsIDYpCiAgICApICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLGZhY2U9ImJvbGQiKSkgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaXplID0xKSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgeGxhYigiU2ltaWxhcml0eS10by1TZWxmIikgKyB5bGFiKCJJbmdyb3VwIENsYXNzaWZpY2F0aW9uIikKV1NSLklORy5DT05ELjIucGxvdApgYGAKCiMjIENvbWJpbmUgUGxvdHMKCmBgYHtyfQpDT01CLklORy5DT05ELjIucGxvdDEgPC0gZ2dhcnJhbmdlKERFUy5JTkcuQ09ORC4yLnBsb3QsIFNSLklORy5DT05ELjIucGxvdCwgV1NSLklORy5DT05ELjIucGxvdCwgbGFiZWxzPWMoIkEiLCJCIiwiQyIpLCBucm93PTEpCkNPTUIuSU5HLkNPTkQuMi5wbG90MiA8LSBnZ2FycmFuZ2UoREVTLklORy5DT05ELjIucGxvdCwgU1IuSU5HLkNPTkQuMi5wbG90LCBXU1IuSU5HLkNPTkQuMi5wbG90LCBsYWJlbHM9YygiRCIsIkUiLCJGIiksIG5yb3c9MSkKYGBgCgoKIyMgTWV0YWNvbnRyYXN0IFJhdGlvCgpgYGB7cn0KTUNTLlNSLkNPTkQuMi5wIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoTUNTLlNSLkNPTkQuMikjLCBtZXRob2QgPSAicG9zdGVyaW9yX2xpbnByZWQiKQpNQ1MuU1IuQ09ORC4yLnBfIDwtIE1DUy5TUi5DT05ELjIucCRgbWV0YUNvbnRyYXN0Uy5aOm91dGdyb3VwYApNQ1MuU1IuQ09ORC4yLk1DUnBsb3QgPC1nZ3Bsb3QoTUNTLlNSLkNPTkQuMi5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMobGluZXR5cGU9ZWZmZWN0Ml9fLCBjb2xvcj1lZmZlY3QyX18pKSArIAogIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXywgZmlsbD1lZmZlY3QyX18pLCBhbHBoYT0wLjE1KSArIAogIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGlvbiIsIkxvd2VyIFN0YXR1cyIsIkhpZ2hlciBTdGF0dXMiKSwgdmFsdWVzID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcxIikpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwoIAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKyAKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjEyLCAuNyksCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoImxlZnQiLCAiYm90dG9tIiksCiAgICBsZWdlbmQuYm94Lmp1c3QgPSAibGVmdCIsCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKDYsIDYsIDYsIDYpCiAgICApICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEyKSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyLGZhY2U9ImJvbGQiKSkgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaXplID0xKSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgeGxhYigiTWV0YWNvbnRyYXN0IFJhdGlvIikgKyB5bGFiKCJTZWxmLUV2YWx1YXRpb24iKQpNQ1MuU1IuQ09ORC4yLk1DUnBsb3QKYGBgCgojIyBTdW1tZWQgU2ltaWxhcml0eSB0byBPdXRncm91cCBDb21wYXJlZCBBY3Jvc3MgQ29uZGl0aW9ucwoKYGBge3J9CklTT1MuU1IuQ09ORC4yLnAgPC0gY29uZGl0aW9uYWxfZWZmZWN0cyhJU09TLlNSLkNPTkQuMikjLCBtZXRob2QgPSAicG9zdGVyaW9yX2xpbnByZWQiKQpJU09TLlNSLkNPTkQuMi5wXyA8LSBJU09TLlNSLkNPTkQuMi5wJGBpbkdzaW1TLlo6b3V0Z3JvdXBgCklTT1MuU1IuQ09ORC4yLkluR3Bsb3QgPC1nZ3Bsb3QoSVNPUy5TUi5DT05ELjIucF8sIGFlcyhlZmZlY3QxX18sIGVzdGltYXRlX18pKSArICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWVmZmVjdDJfXywgY29sb3I9ZWZmZWN0Ml9fKSkgKyAKICBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18sIGZpbGw9ZWZmZWN0Ml9fKSwgYWxwaGE9MC4xNSkgKyAKICBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJOZWdhdGlvbiIsIkxvd2VyIFN0YXR1cyIsIkhpZ2hlciBTdGF0dXMiKSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMSIpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJOZWdhdGlvbiIsIkxvd2VyIFN0YXR1cyIsIkhpZ2hlciBTdGF0dXMiKSwgdmFsdWVzID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcxIikpICsgCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKC4xMiwgLjcpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJsZWZ0IiwgImJvdHRvbSIpLAogICAgbGVnZW5kLmJveC5qdXN0ID0gImxlZnQiLAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIlNpbWlsYXJpdHktdG8tSW5ncm91cCIpICsgeWxhYigiU2VsZi1FdmFsdWF0aW9uIikKSVNPUy5TUi5DT05ELjIuSW5HcGxvdApgYGAKCiMjIFN1bW1lZCBTaW1pbGFyaXR5IHRvIE91dGdyb3VwIENvbXBhcmVkIEFjcm9zcyBDb25kaXRpb25zCgpgYGB7cn0KSVNPUy5TUi5DT05ELjIucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKElTT1MuU1IuQ09ORC4yKSMsIG1ldGhvZCA9ICJwb3N0ZXJpb3JfbGlucHJlZCIpCklTT1MuU1IuQ09ORC4yLnBfIDwtIElTT1MuU1IuQ09ORC4yLnAkYG91dEdzaW1TLlo6b3V0Z3JvdXBgCklTT1MuU1IuQ09ORC4yLk91dEdwbG90IDwtZ2dwbG90KElTT1MuU1IuQ09ORC4yLnBfLCBhZXMoZWZmZWN0MV9fLCBlc3RpbWF0ZV9fKSkgKyAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1lZmZlY3QyX18sIGNvbG9yPWVmZmVjdDJfXykpICsgCiAgZ2VvbV9yaWJib24oYWVzKHltaW49bG93ZXJfXywgeW1heD11cHBlcl9fLCBmaWxsPWVmZmVjdDJfXyksIGFscGhhPTAuMTUpICsgCiAgc2NhbGVfbGluZXR5cGVfZGlzY3JldGUobGFiZWxzID0gYygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIikpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aW9uIiwiTG93ZXIgU3RhdHVzIiwiSGlnaGVyIFN0YXR1cyIpLCB2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzEiKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTmVnYXRpb24iLCJMb3dlciBTdGF0dXMiLCJIaWdoZXIgU3RhdHVzIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMSIpKSArIAogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMTIsIC43KSwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygibGVmdCIsICJib3R0b20iKSwKICAgIGxlZ2VuZC5ib3guanVzdCA9ICJsZWZ0IiwKICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oNiwgNiwgNiwgNikKICAgICkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJTaW1pbGFyaXR5LXRvLU91dGdyb3VwIikgKyB5bGFiKCJTZWxmLUV2YWx1YXRpb24iKQpJU09TLlNSLkNPTkQuMi5PdXRHcGxvdApgYGAKCiMgU3R1ZHkgMwoKIyMgV2FybXRoCgpgYGB7cn0Kd2FybXRoRGYzIDwtIHBpdm90X2xvbmdlcihpbmREaWZmczMsIGNvbHM9c3RhcnRzX3dpdGgoIlRoZXJtXyIpLCBuYW1lc190bz0iR3JvdXAiLCB2YWx1ZXNfdG89Ildhcm10aCIpICU+JSBzZWxlY3Qoc3ViSUQsIEdyb3VwLCBXYXJtdGgpICU+JSBkcm9wX25hKCkKd2FybXRoRGYzJEdyb3VwIDwtIGdzdWIoIlRoZXJtXzEiLCJXaGl0ZSIsIHdhcm10aERmMyRHcm91cCkKd2FybXRoRGYzJEdyb3VwIDwtIGdzdWIoIlRoZXJtXzIiLCJBc2lhbiIsIHdhcm10aERmMyRHcm91cCkKd2FybXRoRGYzJEdyb3VwIDwtIGdzdWIoIlRoZXJtXzQiLCJMYXRpbm8iLCB3YXJtdGhEZjMkR3JvdXApCgp3YXJtdGhEZjMkR3JvdXAgPC0gYXMuZmFjdG9yKHdhcm10aERmMyRHcm91cCkKd2FybXRoRGYzJHN1YklEIDwtIGFzLmZhY3Rvcih3YXJtdGhEZjMkc3ViSUQpCgp3YXJtUGxvdDMgPC0gZ2dwbG90KHdhcm10aERmMywgYWVzKEdyb3VwLCBXYXJtdGgpKSArIAogIGdnZGlzdDo6c3RhdF9oYWxmZXllKGFkanVzdCA9IC41LCB3aWR0aCA9IC43LCAud2lkdGggPSAwLCBqdXN0aWZpY2F0aW9uID0gLS4yLCBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAuMiwgb3V0bGllci5zaGFwZSA9IE5BKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gLjA1LCBhbHBoYSA9IC4xNSkgKyBsYWJzKHk9IlBlcmNlaXZlZCBXYXJtdGgiLHg9IlJhY2lhbCBHcm91cCIpICsganRvb2xzOjp0aGVtZV9hcGEoKQpgYGAKCiMjIFN0YXR1cwoKYGBge3J9CmluZERpZmZzMyRTdGF0dXMgPC0gTlVMTApzdGF0dXNEZjMgPC0gcGl2b3RfbG9uZ2VyKGluZERpZmZzMywgY29scz1lbmRzX3dpdGgoIl9TdGF0dXMiKSwgbmFtZXNfdG89Ikdyb3VwIiwgdmFsdWVzX3RvPSJTdGF0dXMiKSAlPiUgc2VsZWN0KHN1YklELCBHcm91cCwgU3RhdHVzKSAlPiUgZHJvcF9uYSgpCnN0YXR1c0RmMyRHcm91cCA8LSBnc3ViKCJfU3RhdHVzIiwiIiwgc3RhdHVzRGYzJEdyb3VwKQoKc3RhdHVzRGYzJEdyb3VwIDwtIGFzLmZhY3RvcihzdGF0dXNEZjMkR3JvdXApCnN0YXR1c0RmMyRzdWJJRCA8LSBhcy5mYWN0b3Ioc3RhdHVzRGYzJHN1YklEKQoKc3RhdHVzUGxvdDMgPC0gZ2dwbG90KHN0YXR1c0RmMywgYWVzKEdyb3VwLCBTdGF0dXMpKSArIAogIGdnZGlzdDo6c3RhdF9oYWxmZXllKGFkanVzdCA9IC41LCB3aWR0aCA9IC43LCAud2lkdGggPSAwLCBqdXN0aWZpY2F0aW9uID0gLS4yLCBwb2ludF9jb2xvdXIgPSBOQSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGggPSAuMiwgb3V0bGllci5zaGFwZSA9IE5BKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gLjA1LCBhbHBoYSA9IC4zKSArIGxhYnMoeT0iUGVyY2VpdmVkIFN0YXR1cyIseD0iUmFjaWFsIEdyb3VwIikgKyBqdG9vbHM6OnRoZW1lX2FwYSgpCmBgYAoKIyMgQ29tYmluZSBXYXJtdGggYW5kIFN0YXR1cyBQbG90cwoKYGBge3J9CndzUGxvdDMgPC0gd2FybVBsb3QzICsgc3RhdHVzUGxvdDMKd3NQbG90MwpgYGAKCiMjIFByb2plY3Rpb24gUmF0ZXMKCmBgYHtyfQptRGlmZlBsb3QzIDwtIGdncGxvdChwYXJhbXMzLCBhZXMoY29uZGl0aW9uLCBtKSkgKyAKICBnZ2Rpc3Q6OnN0YXRfaGFsZmV5ZShhZGp1c3QgPSAuNSwgd2lkdGggPSAuNywgLndpZHRoID0gMCwganVzdGlmaWNhdGlvbiA9IC0uMiwgcG9pbnRfY29sb3VyID0gTkEpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gLjIsIG91dGxpZXIuc2hhcGUgPSBOQSkgKyBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJNYWpvcml0eSIsIk1pbm9yaXR5IikpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IC4wNSwgYWxwaGEgPSAuMTUpICsgbGFicyh5PSJQcm9qZWN0aW9uIFJhdGUiLHg9IlJhY2lhbCBHcm91cCIpICsganRvb2xzOjp0aGVtZV9hcGEoKQpgYGAKCiMjIEJpYXMgUGFyYW1ldGVyCgpgYGB7cn0KYkRpZmZQbG90MyA8LSBnZ3Bsb3QocGFyYW1zMywgYWVzKGNvbmRpdGlvbiwgYmlhcykpICsgCiAgZ2dkaXN0OjpzdGF0X2hhbGZleWUoYWRqdXN0ID0gLjUsIHdpZHRoID0gLjcsIC53aWR0aCA9IDAsIGp1c3RpZmljYXRpb24gPSAtLjIsIHBvaW50X2NvbG91ciA9IE5BKSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IC4yLCBvdXRsaWVyLnNoYXBlID0gTkEpICsgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiTWFqb3JpdHkiLCJNaW5vcml0eSIpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMDUsIGFscGhhID0gLjE1KSArIGxhYnMoeT0iQmlhcyBQYXJhbWV0ZXIiLHg9IlJhY2lhbCBHcm91cCIpICsganRvb2xzOjp0aGVtZV9hcGEoKQpgYGAKCiMjIENvbWJpbmUgQmlhcyBhbmQgUHJvamVjdGlvbiBQbG90cwoKYGBge3J9Cm1iUGxvdDMgPC0gbURpZmZQbG90MyArIGJEaWZmUGxvdDMKbWJQbG90MwpgYGAKCiMjIERlc2lyYWJpbGl0eSBJbmdyb3VwIENsYXNzaWZpY2F0aW9uCgpgYGB7cn0KREVTLklORy5DT05ELjMucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKERFUy5JTkcuQ09ORC4zKQpERVMuSU5HLkNPTkQuMy5wXyA8LSBERVMuSU5HLkNPTkQuMy5wJGBkZXNpcmFiaWxpdHkuWjpjb25kaXRpb25gCkRFUy5JTkcuQ09ORC4zLnBsb3QgPC1nZ3Bsb3QoREVTLklORy5DT05ELjMucF8sIGFlcyhlZmZlY3QxX18sIGVzdGltYXRlX18pKSArICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWVmZmVjdDJfXywgY29sb3I9ZWZmZWN0Ml9fKSkgKyBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18sIGZpbGw9ZWZmZWN0Ml9fKSwgYWxwaGE9MC4xNSkgKyBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJNYWpvcml0eSIsIk1pbm9yaXR5IikpICsgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSwgdmFsdWVzID0gYygiIzQ0QUE5OSIsIiMzMzIyODgiKSkgKyBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMTIsIC43KSwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygibGVmdCIsICJib3R0b20iKSwKICAgIGxlZ2VuZC5ib3guanVzdCA9ICJsZWZ0IiwKICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oNiwgNiwgNiwgNikKICAgICkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJEZXNpcmFiaWxpdHkiKSArIHlsYWIoIkluZ3JvdXAgQ2xhc3NpZmljYXRpb24iKQpERVMuSU5HLkNPTkQuMy5wbG90CmBgYAoKCiMjIFNlbGYtRXZhbHVhdGlvbiBJbmdyb3VwIENsYXNzaWZpY2F0aW9uCgpgYGB7cn0KU1IuSU5HLkNPTkQuMy5wIDwtIGNvbmRpdGlvbmFsX2VmZmVjdHMoU1IuSU5HLkNPTkQuMykKU1IuSU5HLkNPTkQuMy5wXyA8LSBTUi5JTkcuQ09ORC4zLnAkYHNlbGZSZXNwLlo6Y29uZGl0aW9uYApTUi5JTkcuQ09ORC4zLnBsb3QgPC1nZ3Bsb3QoU1IuSU5HLkNPTkQuMy5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMobGluZXR5cGU9ZWZmZWN0Ml9fLCBjb2xvcj1lZmZlY3QyX18pKSArIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXywgZmlsbD1lZmZlY3QyX18pLCBhbHBoYT0wLjE1KSArIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSkgKyBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHNjYWxlX2ZpbGxfbWFudWFsKCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJNYWpvcml0eSIsIk1pbm9yaXR5IiksIHZhbHVlcyA9IGMoIiM0NEFBOTkiLCIjMzMyMjg4IikpICsgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKC4xMiwgLjcpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJsZWZ0IiwgImJvdHRvbSIpLAogICAgbGVnZW5kLmJveC5qdXN0ID0gImxlZnQiLAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIlNlbGYtRXZhbHVhdGlvbiIpICsgeWxhYigiSW5ncm91cCBDbGFzc2lmaWNhdGlvbiIpClNSLklORy5DT05ELjMucGxvdApgYGAKCiMjIFNpbWlsYXJpdHktdG8tU2VsZiBJbmdyb3VwIENsYXNzaWZpY2F0aW9uCgpgYGB7cn0KV1NSLklORy5DT05ELjMucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKFdTUi5JTkcuQ09ORC4zKQpXU1IuSU5HLkNPTkQuMy5wXyA8LSBXU1IuSU5HLkNPTkQuMy5wJGBXU1IuWjpjb25kaXRpb25gCldTUi5JTkcuQ09ORC4zLnBsb3QgPC1nZ3Bsb3QoV1NSLklORy5DT05ELjMucF8sIGFlcyhlZmZlY3QxX18sIGVzdGltYXRlX18pKSArICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWVmZmVjdDJfXywgY29sb3I9ZWZmZWN0Ml9fKSkgKyBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18sIGZpbGw9ZWZmZWN0Ml9fKSwgYWxwaGE9MC4xNSkgKyBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJNYWpvcml0eSIsIk1pbm9yaXR5IikpICsgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSwgdmFsdWVzID0gYygiIzQ0QUE5OSIsIiMzMzIyODgiKSkgKyBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMTIsIC43KSwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygibGVmdCIsICJib3R0b20iKSwKICAgIGxlZ2VuZC5ib3guanVzdCA9ICJsZWZ0IiwKICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oNiwgNiwgNiwgNikKICAgICkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJTaW1pbGFyaXR5LXRvLVNlbGYiKSArIHlsYWIoIkluZ3JvdXAgQ2xhc3NpZmljYXRpb24iKQpXU1IuSU5HLkNPTkQuMy5wbG90CmBgYAoKIyMgQ29tYmluZSBQbG90cwoKYGBge3J9CkNPTUIuSU5HLkNPTkQuMy5wbG90MSA8LSBnZ2FycmFuZ2UoREVTLklORy5DT05ELjMucGxvdCwgU1IuSU5HLkNPTkQuMy5wbG90LCBXU1IuSU5HLkNPTkQuMy5wbG90LCBsYWJlbHM9YygiQSIsIkIiLCJDIiksIG5yb3c9MSkKQ09NQi5JTkcuQ09ORC4zLnBsb3QzIDwtIGdnYXJyYW5nZShERVMuSU5HLkNPTkQuMy5wbG90LCBTUi5JTkcuQ09ORC4zLnBsb3QsIFdTUi5JTkcuQ09ORC4zLnBsb3QsIGxhYmVscz1jKCJHIiwiSCIsIkkiKSwgbnJvdz0xKQpgYGAKCiMjIE1ldGFjb250cmFzdCBSYXRpbwoKYGBge3J9Ck1DUy5TUi5DT05ELjMucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKE1DUy5TUi5DT05ELjMpCk1DUy5TUi5DT05ELjMucF8gPC0gTUNTLlNSLkNPTkQuMy5wJGBtZXRhQ29udHJhc3RTLlo6Y29uZGl0aW9uYApNQ1MuU1IuQ09ORC4zLk1DUnBsb3QgPC1nZ3Bsb3QoTUNTLlNSLkNPTkQuMy5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMobGluZXR5cGU9ZWZmZWN0Ml9fLCBjb2xvcj1lZmZlY3QyX18pKSArIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXywgZmlsbD1lZmZlY3QyX18pLCBhbHBoYT0wLjE1KSArIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSkgKyBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHNjYWxlX2ZpbGxfbWFudWFsKCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJNYWpvcml0eSIsIk1pbm9yaXR5IiksIHZhbHVlcyA9IGMoIiM0NEFBOTkiLCIjMzMyMjg4IikpICsgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKC4xMiwgLjcpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJsZWZ0IiwgImJvdHRvbSIpLAogICAgbGVnZW5kLmJveC5qdXN0ID0gImxlZnQiLAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIk1ldGFjb250cmFzdCBSYXRpbyIpICsgeWxhYigiU2VsZi1FdmFsdWF0aW9uIikKTUNTLlNSLkNPTkQuMy5NQ1JwbG90CmBgYAoKIyMgU3VtbWVkIFNpbWlsYXJpdHkgdG8gSW5ncm91cCBDb21wYXJlZCBBY3Jvc3MgQ29uZGl0aW9ucwoKYGBge3J9CklTT1MuU1IuQ09ORC4zLnAgPC0gY29uZGl0aW9uYWxfZWZmZWN0cyhJU09TLlNSLkNPTkQuMykKSVNPUy5TUi5DT05ELjMucF8gPC0gSVNPUy5TUi5DT05ELjMucCRgaW5Hc2ltUy5aOmNvbmRpdGlvbmAKSVNPUy5TUi5DT05ELjMuSW5HcGxvdCA8LWdncGxvdChJU09TLlNSLkNPTkQuMy5wXywgYWVzKGVmZmVjdDFfXywgZXN0aW1hdGVfXykpICsgIGdlb21fbGluZShhZXMobGluZXR5cGU9ZWZmZWN0Ml9fLCBjb2xvcj1lZmZlY3QyX18pKSArIGdlb21fcmliYm9uKGFlcyh5bWluPWxvd2VyX18sIHltYXg9dXBwZXJfXywgZmlsbD1lZmZlY3QyX18pLCBhbHBoYT0wLjE1KSArIHNjYWxlX2xpbmV0eXBlX2Rpc2NyZXRlKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSkgKyBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHNjYWxlX2ZpbGxfbWFudWFsKCAKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJNYWpvcml0eSIsIk1pbm9yaXR5IiksIHZhbHVlcyA9IGMoIiM0NEFBOTkiLCIjMzMyMjg4IikpICsgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKC4xMiwgLjcpLAogICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJsZWZ0IiwgImJvdHRvbSIpLAogICAgbGVnZW5kLmJveC5qdXN0ID0gImxlZnQiLAogICAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KQogICAgKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMiksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMixmYWNlPSJib2xkIikpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2l6ZSA9MSkpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCnBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkgKwogIHhsYWIoIlNpbWlsYXJpdHktdG8tSW5ncm91cCIpICsgeWxhYigiU2VsZi1FdmFsdWF0aW9uIikKSVNPUy5TUi5DT05ELjMuSW5HcGxvdApgYGAKCiMjIFN1bW1lZCBTaW1pbGFyaXR5IHRvIE91dGdyb3VwIENvbXBhcmVkIEFjcm9zcyBDb25kaXRpb25zCgpgYGB7cn0KSVNPUy5TUi5DT05ELjMucCA8LSBjb25kaXRpb25hbF9lZmZlY3RzKElTT1MuU1IuQ09ORC4zKQpJU09TLlNSLkNPTkQuMy5wXyA8LSBJU09TLlNSLkNPTkQuMy5wJGBvdXRHc2ltUy5aOmNvbmRpdGlvbmAKSVNPUy5TUi5DT05ELjMuT3V0R3Bsb3QgPC1nZ3Bsb3QoSVNPUy5TUi5DT05ELjMucF8sIGFlcyhlZmZlY3QxX18sIGVzdGltYXRlX18pKSArICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPWVmZmVjdDJfXywgY29sb3I9ZWZmZWN0Ml9fKSkgKyBnZW9tX3JpYmJvbihhZXMoeW1pbj1sb3dlcl9fLCB5bWF4PXVwcGVyX18sIGZpbGw9ZWZmZWN0Ml9fKSwgYWxwaGE9MC4xNSkgKyBzY2FsZV9saW5ldHlwZV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJNYWpvcml0eSIsIk1pbm9yaXR5IikpICsgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk1ham9yaXR5IiwiTWlub3JpdHkiKSwgdmFsdWVzID0gYygiIzQ0QUE5OSIsIiMzMzIyODgiKSkgKyBzY2FsZV9maWxsX21hbnVhbCggCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTWFqb3JpdHkiLCJNaW5vcml0eSIpLCB2YWx1ZXMgPSBjKCIjNDRBQTk5IiwiIzMzMjI4OCIpKSArIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguMTIsIC43KSwKICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygibGVmdCIsICJib3R0b20iKSwKICAgIGxlZ2VuZC5ib3guanVzdCA9ICJsZWZ0IiwKICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4oNiwgNiwgNiwgNikKICAgICkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTIpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTIsZmFjZT0iYm9sZCIpKSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNpemUgPTEpKSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLApwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpICsKICB4bGFiKCJTaW1pbGFyaXR5LXRvLU91dGdyb3VwIikgKyB5bGFiKCJTZWxmLUV2YWx1YXRpb24iKQpJU09TLlNSLkNPTkQuMy5PdXRHcGxvdApgYGAKCiMgU3R1ZGllcyBDb21iaW5lZAoKYGBge3J9CndzUGxvdDIzIDwtIHdzUGxvdDIgLyB3c1Bsb3QzCndzUGxvdDIzCmdnc2F2ZSh3c1Bsb3QyMywgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL3dhcm1TdGF0dXMyMy5wbmciLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDEwLCBoZWlnaHQgPSAxMikKZ2dzYXZlKHdzUGxvdDIzLCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvd2FybVN0YXR1czIzLnRpZmYiLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDEwLCBoZWlnaHQgPSAxMikKYGBgCgpgYGB7cn0KbWJQbG90MjMgPC0gbWJQbG90MiAvIG1iUGxvdDMKbWJQbG90MjMKZ2dzYXZlKG1iUGxvdDIzLCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvcHJvakJpYXMyMy5wbmciLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDEyLCBoZWlnaHQgPSA5KQpnZ3NhdmUobWJQbG90MjMsIGZpbGUgPSAiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9QbG90cy9wcm9qQmlhczIzLnRpZmYiLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDEyLCBoZWlnaHQgPSA5KQpgYGAKCmBgYHtyfQpDT01CLklORy5BTEwgPC0gZ2dhcnJhbmdlKENPTUIuSU5HLjEucGxvdDEsIENPTUIuSU5HLkNPTkQuMi5wbG90MiwgQ09NQi5JTkcuQ09ORC4zLnBsb3QzLCBucm93ID0zKQoKZ2dzYXZlKENPTUIuSU5HLkFMTCwgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL3Rlc3RQbG90LnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTEsIGhlaWdodCA9IDE0KQoKZ2dzYXZlKENPTUIuSU5HLkFMTCwgZmlsZSA9ICIvVm9sdW1lcy9SZXNlYXJjaCBQcm9qZWN0L1NlbGYtQW5jaG9yaW5nL1Bsb3RzL3Rlc3RQbG90LnRpZmYiLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDExLCBoZWlnaHQgPSAxNCkKYGBgCgoKYGBge3J9CnRyYWluaW5nUGxvdHMgPC0gZ2dwdWJyOjpnZ2FycmFuZ2UoTUNTLlNSLkNPTkQuMi5NQ1JwbG90LCBJU09TLlNSLkNPTkQuMi5JbkdwbG90LCBJU09TLlNSLkNPTkQuMi5PdXRHcGxvdCwKICAgICAgICAgIE1DUy5TUi5DT05ELjMuTUNScGxvdCwgSVNPUy5TUi5DT05ELjMuSW5HcGxvdCwgSVNPUy5TUi5DT05ELjMuT3V0R3Bsb3QsCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIpLAogICAgICAgICAgbnJvdyA9IDIsIG5jb2wgPSAzKQoKZ2dzYXZlKHRyYWluaW5nUGxvdHMsIGZpbGUgPSAiL1ZvbHVtZXMvUmVzZWFyY2ggUHJvamVjdC9TZWxmLUFuY2hvcmluZy9QbG90cy90cmFpblBsb3QucG5nIiwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIsIHdpZHRoPSAxMCwgaGVpZ2h0ID0gOSkKCmdnc2F2ZSh0cmFpbmluZ1Bsb3RzLCBmaWxlID0gIi9Wb2x1bWVzL1Jlc2VhcmNoIFByb2plY3QvU2VsZi1BbmNob3JpbmcvUGxvdHMvdHJhaW5QbG90LnRpZmYiLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDEwLCBoZWlnaHQgPSA5KQpgYGAKCiMgRm9yIFRhbGsKCiMjIFN0dWR5LVNwZWNpZmljIEdlbmVyYWxpemF0aW9uIFBoYXNlIFBsb3RzCgpgYGB7cn0KU1IuSU5HLjEucGxvdCArIFNSLklORy5DT05ELjIucGxvdCArIFNSLklORy5DT05ELjMucGxvdApnZ3NhdmUoZmlsZSA9ICJ+L0Rlc2t0b3AvU1IuSU5HLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTYsIGhlaWdodCA9IDUpCgpERVMuSU5HLjEucGxvdCArIERFUy5JTkcuQ09ORC4yLnBsb3QgKyBERVMuSU5HLkNPTkQuMy5wbG90Cmdnc2F2ZShmaWxlID0gIn4vRGVza3RvcC9ERVMuSU5HLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTYsIGhlaWdodCA9IDUpCgpXU1IuSU5HLjEucGxvdCArIFdTUi5JTkcuQ09ORC4yLnBsb3QgKyBXU1IuSU5HLkNPTkQuMy5wbG90Cmdnc2F2ZShmaWxlID0gIn4vRGVza3RvcC9XU1IuSU5HLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTYsIGhlaWdodCA9IDUpCmBgYAoKIyMgU3R1ZHktU3BlY2lmaWMgVHJhaW5pbmcgUGhhc2UgUGxvdHMKCmBgYHtyfQpNQ1MuU1IuMS5NQ1JwbG90ICsgTUNTLlNSLkNPTkQuMi5NQ1JwbG90ICsgTUNTLlNSLkNPTkQuMy5NQ1JwbG90Cmdnc2F2ZShmaWxlID0gIn4vRGVza3RvcC9NQ1MuU1IucG5nIiwgZHBpID0gMzAwLCB1bml0cyA9ICJpbiIsIHdpZHRoPSAxNiwgaGVpZ2h0ID0gNSkKCklTT1MuU1IuMS5JbkdwbG90ICsgSVNPUy5TUi5DT05ELjIuSW5HcGxvdCArIElTT1MuU1IuQ09ORC4zLkluR3Bsb3QKZ2dzYXZlKGZpbGUgPSAifi9EZXNrdG9wL0luRy5TUi5wbmciLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDE2LCBoZWlnaHQgPSA1KQoKSVNPUy5TUi4xLk91dEdwbG90ICsgSVNPUy5TUi5DT05ELjIuT3V0R3Bsb3QgKyBJU09TLlNSLkNPTkQuMy5PdXRHcGxvdApnZ3NhdmUoZmlsZSA9ICJ+L0Rlc2t0b3AvT3V0Ry5TUi5wbmciLCBkcGkgPSAzMDAsIHVuaXRzID0gImluIiwgd2lkdGg9IDE2LCBoZWlnaHQgPSA1KQpgYGAKCmBgYHtyfQp3c1Bsb3QyCmdnc2F2ZShmaWxlID0gIn4vRGVza3RvcC93c1Bsb3QyLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTAsIGhlaWdodCA9IDUpCgp3c1Bsb3QzCmdnc2F2ZShmaWxlID0gIn4vRGVza3RvcC93c1Bsb3QzLnBuZyIsIGRwaSA9IDMwMCwgdW5pdHMgPSAiaW4iLCB3aWR0aD0gMTAsIGhlaWdodCA9IDUpCmBgYAoKCg==